Amazon SQSデッドレターキューにメッセージが入ったらSlackに通知するしくみをAWS CDKで構築する
こんにちは。サービスグループの武田です。
Amazon SQSやAWS Lambdaなどには、処理が失敗した際にメッセージを退避させるしくみとしてデッドレターキュー(以下、DLQ)というものが用意されています。DLQを用意しておくことで無制限のリトライを防止したり、デバッグに役立てることができます。
とはいえ、肝心のDLQにメッセージが入ったことを検知できなければ何の意味もありません。今回はDLQにメッセージが入った際に、Slackに通知されるしくみをAWS CDKを利用して構築してみました。
なお、ソースコードはGitHubに上がっています。
TAKEDA-Takashi/aws-cdk-sqs-dlq-alert-slack
環境
今回は次のような環境で検証しました。
$ node -v v10.19.0 $ sw_vers ProductName: Mac OS X ProductVersion: 10.15.7 BuildVersion: 19H15
やってみた
CDkでAWS環境を作っていくわけですが、その前にAWS ChatbotとSlackの連携設定を済ませておく必要があります。これは手動で行う必要があります。設定手順についてはmeのエントリを参考にしてください。
それではCDKのプロジェクトを作成していきましょう。
$ mkdir aws-cdk-sqs-dlq-alert-slack && cd $_ $ npx cdk init --language typescript $ npm install @aws-cdk/aws-sqs @aws-cdk/aws-sns @aws-cdk/aws-chatbot @aws-cdk/aws-cloudwatch @aws-cdk/aws-cloudwatch-actions
プロジェクトが作成できたら環境を定義します。今回は検証用にTestQueueおよびそれのDLQを定義します。検証を用意にするためmaxReceiveCount
は1
にしています。またSlackChannel
のスペースIDなどは使用するIDに変更してください。
// SQS const testQueueDlq = new Queue(this, 'TestQueue-DLQ', { queueName: 'TestQueue-DLQ', }); const testQueue = new Queue(this, 'TestQueue', { queueName: 'TestQueue', deadLetterQueue: { maxReceiveCount: 1, queue: testQueueDlq, }, }); // SNS const chatbotNotificationTopic = new Topic(this, 'ChatbotNotificationTopic', { topicName: 'ChatbotNotificationTopic', }); // CloudWatch const alarm = new Alarm(this, `TestQueue-DLQ-Alarm`, { metric: testQueueDlq.metricApproximateNumberOfMessagesVisible(), evaluationPeriods: 1, threshold: 1, treatMissingData: TreatMissingData.NOT_BREACHING, }); alarm.addAlarmAction(new SnsAction(chatbotNotificationTopic)); alarm.addOkAction(new SnsAction(chatbotNotificationTopic)); // Chatbot new SlackChannelConfiguration(this, 'SlackChannel', { slackChannelConfigurationName: 'sandbox', slackWorkspaceId: 'T03XXXXXX', slackChannelId: 'CFG000000', notificationTopics: [chatbotNotificationTopic], });
準備ができたらデプロイします。
$ npx cdk deploy
リソースが作成されるとSlackにOK通知が飛んできます。
SQSのページを見てみるとキューが2つ作られています。
TestQueueに新しいメッセージを送信します。
ポーリングしてメッセージを受信します。この時点で受信回数が1回とカウントされるため、メッセージを削除しなければDLQに移されます。
無事にDLQにメッセージが移されました。
しばらくするとSlackにアラートが飛んできました!
まとめ
サーバーレスアーキテクチャなどでは何かとお世話になるDLQですが、しっかりと通知まで構築することで運用負荷が下がります。Slack連携も含めてこんな簡単に構築できてすばらしいの一言ですね。活用していきましょう!